# -*- coding: utf-8 -*-
"""
定时汇总任务模块
负责按周期统计每个项目未处理的消息并通过Webhook推送
"""

import logging
from celery import shared_task
from django.utils import timezone
from django.conf import settings
from projects.models import Project, Message
from projects.webhook_service import WebhookService
from .models import TaskExecutionLog

logger = logging.getLogger(__name__)

@shared_task
def summarize_pending_messages_and_push():
    """
    定期统计每个项目未处理的消息并通过webhook推送
    
    功能：
    1. 遍历所有项目
    2. 统计每个项目未处理的消息数量
    3. 为每个有未处理消息的项目生成汇总信息
    4. 通过事件为push的webhooks发送通知
    5. 内容包括：项目名称、未处理消息数、开发者信息、平台访问链接
    """
    try:
        # 创建执行日志记录
        log_entry = TaskExecutionLog.objects.create(
            task_id=None,  # 全局任务，无特定关联任务
            is_success=False
        )
        
        # 记录开始执行时间
        log_content = [f"任务开始执行: {timezone.now().strftime('%Y-%m-%d %H:%M:%S')}"]
        
        # 获取所有项目
        projects = Project.objects.all()
        log_content.append(f"找到{projects.count()}个项目")
        
        # 初始化统计数据
        total_processed = 0
        success_count = 0
        failure_count = 0
        
        # 为每个项目统计未处理消息
        for project in projects:
            total_processed += 1
            
            try:
                # 统计该项目的未处理消息数量（status='pending'）
                pending_count = Message.objects.filter(
                    project=project,
                    status='pending'
                ).count()
                
                # 只有当有未处理消息时才推送
                if pending_count > 0:
                    # 获取基础域名，用于生成完整的访问链接
                    site_domain = getattr(settings, 'SITE_DOMAIN', 'http://localhost:8000')
                    
                    # 创建统计消息内容
                    summary = {
                        'project_name': project.name,
                        'pending_count': pending_count,
                        'developer_info': 'ip997.com',  # 开发者信息
                        'platform_link': f"{site_domain}/projects/{project.id}/messages/",  # 完整的平台访问链接
                        'timestamp': timezone.now().isoformat(),
                        'summary_time': timezone.now().strftime('%Y-%m-%d %H:%M:%S')
                    }
                    
                    # 推送统计信息到Webhook
                    WebhookService.trigger_webhook('push', summary, project)
                    
                    success_count += 1
                    log_content.append(f"成功推送项目{project.name}的未处理消息统计，数量：{pending_count}")
                else:
                    log_content.append(f"项目{project.name}没有未处理消息，跳过推送")
                    
            except Exception as e:
                failure_count += 1
                error_msg = f"推送项目{project.name}的未处理消息统计失败: {str(e)}"
                log_content.append(error_msg)
                logger.error(error_msg)
        
        # 更新执行日志
        log_entry.end_time = timezone.now()
        log_entry.is_success = True
        log_entry.log_content = '\n'.join(log_content)
        log_entry.total_processed = total_processed
        log_entry.success_count = success_count
        log_entry.failure_count = failure_count
        log_entry.save()
        
        return {
            'status': 'success',
            'total_processed': total_processed,
            'success_count': success_count,
            'failure_count': failure_count
        }
        
    except Exception as e:
        # 记录执行错误
        if 'log_entry' in locals():
            log_entry.end_time = timezone.now()
            log_entry.is_success = False
            log_entry.error_message = str(e)
            log_entry.save()
        
        logger.error(f"执行未处理消息统计推送任务失败: {str(e)}")
        
        return {
            'status': 'failure',
            'error': str(e)
        }

# 在tasks.py中导入此函数以确保任务能被正确注册
# 或者在apps.py中直接注册此任务